<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function twoScans(nums) {
      /**  * 本方案使用两次扫描的方法，第一次扫描找出数组所有0，
       * 并将其交换至数组前面；第二次扫描找出数组所有1，并
       * 将其交换至0后续的元素，由于数组中仅有0，1，2因此
       * 0，1排序好后2自然排序好了
       */

      // 记录已经排好序的索引
      let last = 0;
      // 两次扫描
      for (let i = 0; i < 2; i++) {
        // 从已经排好序的索引开始，遍历数组所有元素
        for (let j = last; j < nums.length; j++) {
          // 第一次扫描为0时，第二次扫描为1时
          // 将last位置元素与当前元素交换，并
          // 将已经排好序的索引加1
          if (nums[j] === i) {
            // 交换数组两元素
            let temp = nums[last];
            nums[last] = nums[j];
            nums[j] = temp;
            // 将已经排好序的索引加1
            last++;
          }
        }
      }
      // 返回结果
      return nums;
    }
    console.log(twoScans(nums = [2, 0, 2, 1, 1, 0]))
  </script>
</body>

</html>